import java.math.BigInteger;
import java.util.Scanner;

public class BigIntegerCalculator {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);

		try {
			// 读取用户输入的两个大整数
			System.out.print("请输入第一个大整数: ");
			BigInteger num1 = new BigInteger(scanner.nextLine().trim());

			System.out.print("请输入第二个大整数: ");
			BigInteger num2 = new BigInteger(scanner.nextLine().trim());

			// 计算并输出和、差、积
			System.out.println("\n===== 基本运算结果 =====");
			System.out.println("和: " + num1.add(num2));
			System.out.println("差 (num1 - num2): " + num1.subtract(num2));
			System.out.println("积: " + num1.multiply(num2));

			// 计算商（处理除数为0和无法整除的情况）
			System.out.print("商 (num1 / num2): ");
			if (num2.equals(BigInteger.ZERO)) {
				System.out.println("错误：除数不能为0");
			} else {
				try {
					BigInteger quotient = num1.divide(num2);
					System.out.println(quotient);
				} catch (ArithmeticException e) {
					System.out.println("错误：无法整除（无整数商）");
				}
			}

			// 计算第一个大整数的因子个数（不包括1和自身）
			System.out.println("\n===== 因子个数计算 =====");
			int factorCount = countFactors(num1);
			System.out.println("大整数 " + num1 + " 的因子个数（不包括1和自身）: " + factorCount);

		} catch (NumberFormatException e) {
			System.out.println("输入错误：请输入有效的整数");
		} finally {
			scanner.close();
		}
	}

	/**
	 * 计算大整数的因子个数（不包括1和自身）
	 * @param n 待计算的大整数
	 * @return 符合条件的因子个数
	 */
	private static int countFactors(BigInteger n) {
		// 小于等于1的数没有符合条件的因子
		if (n.compareTo(BigInteger.ONE) <= 0) {
			return 0;
		}

		int count = 0;
		BigInteger i = BigInteger.valueOf(2); // 从2开始检查因子
		BigInteger sqrtN = sqrt(n); // 计算n的平方根（优化循环范围）

		// 遍历到sqrt(n)，避免冗余计算
		while (i.compareTo(sqrtN) <= 0) {
			if (n.mod(i).equals(BigInteger.ZERO)) {
				// i是n的因子
				count++;

				// 计算对应的另一个因子（n/i）
				BigInteger otherFactor = n.divide(i);
				// 确保另一个因子不等于i且不等于n本身
				if (!otherFactor.equals(i) && !otherFactor.equals(n)) {
					count++;
				}
			}
			i = i.add(BigInteger.ONE); // 检查下一个数
		}

		return count;
	}

	/**
	 * 计算大整数的平方根（向下取整）
	 * @param n 非负大整数
	 * @return 平方根的整数部分
	 */
	private static BigInteger sqrt(BigInteger n) {
		if (n.compareTo(BigInteger.ZERO) < 0) {
			throw new ArithmeticException("无法计算负数的平方根");
		}
		if (n.equals(BigInteger.ZERO) || n.equals(BigInteger.ONE)) {
			return n;
		}

		// 二分法查找平方根（优化大整数计算效率）
		BigInteger low = BigInteger.ONE;
		BigInteger high = new BigInteger(n.toString());

		while (low.compareTo(high) <= 0) {
			BigInteger mid = low.add(high).shiftRight(1); // (low + high) / 2
			BigInteger midSquared = mid.multiply(mid);

			int cmp = midSquared.compareTo(n);
			if (cmp == 0) {
				return mid; // 找到精确平方根
			} else if (cmp < 0) {
				low = mid.add(BigInteger.ONE); // 中间值偏小，向右查找
			} else {
				high = mid.subtract(BigInteger.ONE); // 中间值偏大，向左查找
			}
		}

		return high; // 返回小于等于平方根的最大整数
	}
}